<?php
namespace app\user\controller;

use think\facade\View;
use think\facade\Session;
use app\user\model\Setting;
use think\facade\Config;

/**
 * 后台控制器基类
 */
class Controller extends \app\BaseController
{
    protected $user;    // 用户登录信息
    protected $user_id; //商户id
    protected $agent_id;
    protected $controller = ''; // 当前控制器名称
    protected $action = '';     // 当前方法名称
    protected $routeUri = '';   // 当前路由uri
    protected $group = '';  // 当前路由：分组名称

    /**
     * 后台初始化
     */
    public function initialize()
    {
        $this->user = Session::get('hema_user');// 获取登录信息
        $this->getRouteInfo();// 当前路由信息
        $this->checkLogin();// 验证登录
        $this->layout();
    }

    /**
     * 验证登录状态
     */
    private function checkLogin()
    {
        // 验证登录状态
        if (empty($this->user) || (int)$this->user['is_login'] !== 1) {
            return redirect('/index/passport/login')->send();
        }
        $this->user_id = $this->user['user']['user_id']; // 用户ID
        $this->agent_id = $this->user['user']['agent_id']; 
        return true;
    }

    /**
     * 全局layout模板输出
     */
    private function layout()
    {
        // 输出到view
        View::assign([
            'base_url' => base_url(),            // 当前站点域名
            'web' => Setting::getItem('web',0),    //站点设置
            'store_url' => '/user/',       // 后台模块url
            'group' => $this->group,
            'menus' => $this->menus(),         // 后台菜单
            'user' => $this->user,            // 登录信息
            'version' => Config::get('app.hemaphp.version'),
        ]);
    }

     /**
     * 解析当前路由参数 （分组名称、控制器名称、方法名）
     */
    protected function getRouteInfo()
    {
        // 控制器名称
        $this->controller = uncamelize($this->request->controller());
        // 方法名称
        $this->action = $this->request->action();
        // 控制器分组 (用于定义所属模块)
        $group = strstr($this->controller, '.', true);
        $this->group = $group !== false ? $group : $this->controller;
        // 当前uri
        $this->routeUri = "{$this->controller}/$this->action";
    }

    /**
     * 菜单配置
     */
    private function menus()
    {
		foreach ($data = Config('menus') as $group => $first) {
            $data[$group]['active'] = $group === $this->group;
            //$data[0]['active']
            // 遍历：二级菜单
            if (isset($first['submenu'])) {
                foreach ($first['submenu'] as $secondKey => $second) {
                    // 二级菜单所有uri
                    $secondUris = [];
                    if (isset($second['submenu'])) {
                        // 遍历：三级菜单
                        foreach ($second['submenu'] as $thirdKey => $third) {
                            $thirdUris = [];
                            if (isset($third['uris'])) {
                                $secondUris = array_merge($secondUris, $third['uris']);
                                $thirdUris = array_merge($thirdUris, $third['uris']);
                            } else {
                                $secondUris[] = $third['index'];
                                $thirdUris[] = $third['index'];
                            }
                            $data[$group]['submenu'][$secondKey]['submenu'][$thirdKey]['active'] = in_array($this->routeUri, $thirdUris);
                            $data[$group]['submenu'][$secondKey]['active'] = in_array($this->routeUri, $secondUris);
                        }
                    } else {
                        if (isset($second['uris']))
                            $secondUris = array_merge($secondUris, $second['uris']);
                        else
                            $secondUris[] = $second['index'];
                    }
                    // 二级菜单：active
                    !isset($data[$group]['submenu'][$secondKey]['active'])
                    && $data[$group]['submenu'][$secondKey]['active'] = in_array($this->routeUri, $secondUris); 
                }
            }
        }
        return $data;
    }

    /**
     * 返回封装后的 API 数据到客户端
     */
    protected function renderJson($code = 1, string $msg = '', string $url = '', array $data = [])
    {
        return json(compact('code', 'msg', 'url', 'data'));
    }

    /**
     * 返回操作成功json
     */
    protected function renderSuccess(string $msg = 'success', string $url = '', array $data = [])
    {
        return $this->renderJson(1, $msg, $url, $data);
    }

    /**
     * 返回操作失败json
     */
    protected function renderError(string $msg = 'error', string $url = '', array $data = [])
    {
        return $this->renderJson(0, $msg, $url, $data);
    }

    /**
     * 获取post数据 (数组)
     * @param $key
     * @return mixed
     */
    protected function postData($key = null)
    {
        return $this->request->post(empty($key) ? '' : "{$key}/a");
    }

    /**
     * 获取post数据 (数组)
     * @param $key
     * @return mixed
     */
    protected function postForm($key = 'form')
    {
        return $this->postData($key);
    }

    /**
     * 获取post数据 (数组)
     * @param $key
     * @return mixed
     */
    protected function getData($key = null)
    {
        return $this->request->get(is_null($key) ? '' : $key);
    }

}
